#include "stu_manager.h"

bool login_status = false;

void login_in()
{
    char username[30] = {0};
    char password[30] = {0};
    printf("----------登录----------\n");
    printf("账户: ");
    // gets(username);
    fgets(username, sizeof(username), stdin);
    username[strlen(username) - 1] = '\0';
    printf("密码: ");
    // gets(password);
    fgets(password, sizeof(password), stdin);
    password[strlen(password) - 1] = '\0';

    if (strcmp(username, "root") == 0 && strcmp(password, "root") == 0)
    {
        login_status = true;
    }
    else
    {
        login_status = false;
        printf("密码错误!\n");
    }
    return;
}

void insert_stu(linknode_t *head)
{
    s_t st = {0};
    bool is_id_exist = false;
    linknode_t *p = NULL;
    // 1.输入学生信息
    printf("-------------------\n");
    printf("请输入学生的信息[学号 姓名 性别 年龄 分数]: ");
    scanf("%d%s%s%d%lf", &(st.id), st.name, st.sex, &(st.age), &(st.score));
    while (getchar() != '\n')
        ; // 清除缓冲区
    // 2.遍历链表,以id为基准,判断学生是否存在
    p = head;
    while (p->next != NULL)
    {
        if (p->next->data.id == st.id)
        {
            is_id_exist = true;
            printf("已经存在id = %d号学生,请重新输入!\n");
            break;
        }
        p = p->next;
    }
    if (!is_id_exist)
    {
        insert_tail_linklist(head, st);
        printf("插入成功\n");
    }
    return;
}

void display_stu(linknode_t *head)
{
    linknode_t *p = head;
    printf("----------------学生信息表---------------\n");
    printf("-----------------------------------------\n");
    printf("|学号\t| 姓名\t| 性别\t| 年龄\t| 分数\t|\n");
    while (p->next != NULL)
    {
        printf("|%d\t| %s\t| %s\t| %d\t| %.1f\t|\n", p->next->data.id, p->next->data.name, p->next->data.sex, p->next->data.age, p->next->data.score);
        p = p->next;
    }
    printf("-----------------------------------------\n");
}

void find_stu(linknode_t *head)
{
    linknode_t *p = head;
    int id;

    printf("请输入学生学号:");
    scanf("%d", &id);

    while (p->next != NULL)
    {
        if (p->next->data.id == id)
        {
            printf("-----------------------------------------\n");
            printf("|学号\t| 姓名\t| 性别\t| 年龄\t| 分数\t|\n");
            printf("|%d\t| %s\t| %s\t| %d\t| %.1f\t|\n", p->next->data.id, p->next->data.name, p->next->data.sex, p->next->data.age, p->next->data.score);
            printf("-----------------------------------------\n");
            return;
        }
        p = p->next;
    }

    if (p->next == NULL)
    {
        printf("-----------------------------------------\n");
        printf("学号输入错误!\n");
        printf("-----------------------------------------\n");
    }
}

void display_update_info()
{
    printf(" ┏━━━━━━━━━━━━━━━━━━━━━━━┓ \n");
    printf(" ┃        学生信息       ┃ \n");
    printf(" ┣━━━━━━━━━━━━━━━━━━━━━━━┫ \n");
    printf(" ┃      1. 修改学号      ┃ \n");
    printf(" ┃      2. 修改姓名      ┃ \n");
    printf(" ┃      3. 修改性别      ┃ \n");
    printf(" ┃      4. 修改年龄      ┃ \n");
    printf(" ┃      5. 修改分数      ┃ \n");
    printf(" ┃      6. 退出          ┃ \n");
    printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n");
    return;
}

void stu_change_data(linknode_t *temp, int num)
{
    char new_data[100] = {0};
    int new_id;
    int new_age;
    double new_score;

    switch (num)
    {
    case 1:
        printf("请输入新数据:");
        scanf("%s", new_data);
        new_id = atoi(new_data);
        if (new_id > 0)
        {
            temp->data.id = new_id;
        }
        break;
    case 2:
        printf("请输入新数据:");
        scanf("%s", new_data);
        memset(temp->data.name, 0, sizeof(temp->data.name));
        strcpy(temp->data.name, new_data);
        break;
    case 3:
        printf("请输入新数据:");
        scanf("%s", new_data);
        memset(temp->data.sex, 0, sizeof(temp->data.sex));
        strcpy(temp->data.sex, new_data);
        break;
    case 4:
        printf("请输入新数据:");
        scanf("%s", new_data);
        new_age = atoi(new_data);
        if (new_age > 0)
        {
            temp->data.age = new_age;
        }
        break;
    case 5:
        printf("请输入新数据:");
        scanf("%s", new_data);
        new_score = atof(new_data);
        if (new_score > 0)
        {
            temp->data.score = new_score;
        }
        break;
    case 6:
        printf("退出\n");
        break;
    }

    printf("修改成功!\n");
    return;
}

void update_stu_info(linknode_t *info)
{
    int num = 0;
    display_update_info();
loop:
    printf("请输入修改选项[1~6]:");
    scanf("%d", &num);

    while (getchar() != '\n')
        ;

    if (!(num >= 1 && num <= 6))
    {
        printf("信息输入错误,请重试!\n");
        goto loop;
    }

    stu_change_data(info, num);
}

void update_stu(linknode_t *head)
{
    linknode_t *p = head;
    int id = 0;

    printf("请输入学生学号:");
    scanf("%d", &id);
    while (getchar() != '\n')
        ;

    while (p->next != NULL)
    {
        if (p->next->data.id == id)
        {
            update_stu_info(p->next);
            break;
        }
        p = p->next;
    }

    if (p->next == NULL)
    {
        printf("-----------------------------------------\n");
        printf("学号输入错误!\n");
        printf("-----------------------------------------\n");
    }

    return;
}

void delete_stu(linknode_t *head)
{
    int delete_num = 0;
    int ret = 0;
loop:
    printf("请输入学生学号:");
    scanf("%d", &delete_num);

    ret =  delete_data_linklist(head, delete_num);

    if (ret == -1)
    {
        printf("学生列表为空,删除无效\n");
    }
    else if (ret == -2)
    {
        printf("学生信息不存在, 请重新输入\n");
        goto loop;
    }
    else
    {
        printf("删除学号 = %d 学生信息成功!\n", delete_num);
    }
    return;
}